// 包声明：声明该类属于com.itheima.demo包，用于组织代码结构
package com.itheima.demo;

// 导入lombok库中的注解
// @Data注解：自动生成getter、setter、toString、equals、hashCode等方法
import lombok.Data;
// @NoArgsConstructor注解：自动生成无参数构造器（没有参数的构造方法）
import lombok.NoArgsConstructor;
// @AllArgsConstructor注解：自动生成包含所有成员变量的构造器
import lombok.AllArgsConstructor;

// lombok技术可以实现为类自动添加getter setter方法 无参数构造器，toString方法等。
// @Data注解：这是一个组合注解，相当于同时使用了多个lombok注解
// 它会自动生成：
// 1. 所有成员变量的getter方法（获取属性值）
// 2. 所有非final成员变量的setter方法（设置属性值）
// 3. toString()方法（将对象转换为字符串）
// 4. equals(Object o)和hashCode()方法（用于对象比较）
@Data 

// @NoArgsConstructor注解：自动生成一个无参数的构造方法
// 构造方法用于创建对象实例，无参数构造器不需要传入任何参数
@NoArgsConstructor

// @AllArgsConstructor注解：自动生成一个包含所有成员变量的构造方法
// 这个构造方法会接收与类中成员变量数量相同的参数，顺序与成员变量定义顺序一致
@AllArgsConstructor

// 类定义：定义一个名为Card的公共类
// 这是面向对象编程中的一个类，用于表示车辆卡片信息
public class Card {
    // 成员变量（属性）定义：
    
    // private关键字：表示这个属性是私有的，只能在本类中直接访问
    // String类型：表示这是一个字符串
    // carId变量名：用于存储车牌号码
    private String carId; // 车牌号码
    
    // 姓名属性
    private String name;
    
    // 电话属性
    private String phone;
    
    // double类型：表示这是一个双精度浮点数，用于存储小数
    // money变量：用于存储卡余额
    private double money; // 余额

    // 方法定义：预存金额方法
    // public关键字：表示这个方法是公共的，可以被其他类调用
    // void返回类型：表示这个方法不返回任何值
    // deposit方法名：表示存款操作
    // double money参数：表示要存入的金额
    public void deposit(double money) {
        // this关键字：表示当前对象
        // this.money：访问当前对象的money成员变量
        // +=运算符：表示将右侧的值加到左侧变量上
        // 这行代码的意思是：将传入的money金额加到当前卡的余额中
        this.money += money;
    }

    // 方法定义：消费金额方法
    // consume方法名：表示消费操作
    // double money参数：表示要消费的金额
    public void consume(double money) {
        // -=运算符：表示从左侧变量中减去右侧的值
        // 这行代码的意思是：从当前卡的余额中减去消费的金额
        this.money -= money;
    }
}
